Embla Carouselを勧めたい
モチベーション
Swiperも優れたライブラリで気に入っているが、実装がSwiperのロジックに依存してしまうことが多いので、ロジックだけ提供するカルーセルが良い
React / TypeScript の構成で利用する際にコンポーネントではなくロジックを提供してほしい
→ Embla Carousel が軽量で依存関係がなく、柔軟なカスタマイズが可能。
セットアップ
(1) インストール
code:bash
npm install embla-carousel
(2) HTML構造
基本的なHTML構造として、カルーセルのコンテナとスライド要素を用意。
code:html
<div class="embla">
<div class="embla__container">
<div class="embla__slide">スライド 1</div>
<div class="embla__slide">スライド 2</div>
<div class="embla__slide">スライド 3</div>
</div>
</div>
(3) CSS
スライドのレイアウトやアニメーションをカスタマイズするためにCSSを適用。
code:css
.embla {
overflow: hidden;
}
.embla__container {
display: flex;
}
.embla__slide {
flex: 0 0 auto;
width: 100%; /* スライドの幅を調整 */
}
(4) JavaScriptでの初期化
Embla Carouselを初期化するには、JavaScriptでコンテナを指定し、オプションを設定する。
code:javascript
import EmblaCarousel from 'embla-carousel';
const emblaNode = document.querySelector('.embla');
const options = { loop: true }; // ループを有効化
const embla = EmblaCarousel(emblaNode, options);
(5) ボタンやプラグインの追加
ナビゲーションボタン:scrollNextやscrollPrevメソッドを使用してスライドを制御。
code:javascript
const nextButton = document.querySelector('.embla__next');
const prevButton = document.querySelector('.embla__prev');
nextButton.addEventListener('click', () => embla.scrollNext());
prevButton.addEventListener('click', () => embla.scrollPrev());
プラグイン:自動再生(Autoplay)などのプラグインを追加可能。
code:javascript
import Autoplay from 'embla-carousel-autoplay';
const embla = EmblaCarousel(emblaNode, { loop: true }, Autoplay({ delay: 4000 }));
(6) フレームワークでの使用
ReactやVue.jsなどのフレームワーク用のラッパーも提供。例(React):
code:javascript
import useEmblaCarousel from 'embla-carousel-react';
export function EmblaCarousel() {
const emblaRef = useEmblaCarousel({ loop: true });
return (
<div className="embla" ref={emblaRef}>
<div className="embla__container">
<div className="embla__slide">スライド 1</div>
<div className="embla__slide">スライド 2</div>
<div className="embla__slide">スライド 3</div>
</div>
</div>
);
}
主なオプション
loop: true:無限ループを有効化。
skipSnaps: true:高速スワイプ時にスナップをスキップ。
dragFree: true:自由なドラッグを可能に。
align: 'start' | 'center' | 'end':スライドの配置を指定。
特徴
軽量:バンドルサイズは約5.9kb(gzip圧縮時)で、依存関係なし。
スワイプ精度:スワイプの方向と力を考慮し、自然なアニメーションを実現。
カスタマイズ性:APIを通じて高度なカスタマイズが可能。
プラグイン:AutoplayやWheel Gesturesなどの拡張機能。
2. Swiperとの違い
Swiperは多機能で豊富な機能を持つカルーセルライブラリで、Embla Carouselと比較すると以下の点で異なります。
(1) バンドルサイズ
Embla Carousel:約5.9kb(gzip圧縮時)。軽量でコア機能に焦点を当て、必要に応じてカスタマイズ可能。
Swiper:約35.5kb(gzip圧縮時)。多くの機能(ナビゲーション、ページネーション、エフェクトなど)がデフォルトで含まれ、バンドルサイズが大きい。
(2) 機能セット
Embla Carousel:
必要最低限の機能を提供し、拡張はAPIやプラグインを通じて行う。
例:ループ、スワイプ、ドラッグ、スクロールスナップなど。
ナビゲーションボタンやページネーションは自分で実装する必要がある。
Swiper:
豊富なビルトイン機能:ナビゲーションボタン、ページネーション、自動再生、3Dエフェクト(キューブ、フリップ)、キーボード操作など。
すぐに使えるコンポーネントが多く、設定だけで複雑なカルーセルを実現可能。
(3) スワイプ精度とアニメーション
Embla Carousel:
スワイプの方向と力を追跡し、力に応じた滑らかなアニメーションを提供。物理ベースのアニメーションで自然な動きを実現。
例:力強いスワイプでは高速に移動、軽いスワイプではゆっくり移動。
Swiper:
スワイプは方向のみを考慮し、力に応じたアニメーションは限定的。動きは標準的で、Emblaほど「流動的」ではない。
ただし、トランジションエフェクト(フェード、スライド、キューブなど)が豊富。
(4) カスタマイズ性
Embla Carousel:
ベアボーン(最小限の機能)設計で、CSSとJavaScriptで自由にカスタマイズ可能。
APIが充実しており、独自の動作やアニメーションを追加しやすい。
例:reInitメソッドで初期化後のオプション変更が可能。
Swiper:
設定オプションが豊富だが、内部ロジックのカスタマイズは難しい。
提供されたエフェクトや機能の範囲内で動作する設計。
(5) 依存関係と互換性
Embla Carousel:
依存関係なし、ライブラリに依存しない(agnostic)。
モダンブラウザおよびIE11に対応。React、Vue、Angular、Svelte用のラッパーあり。
Swiper:
一部機能(例:仮想スライド)に依存関係がある場合も。
モダンブラウザに最適化されており、IEのサポートは限定的。React、Vue用の専用コンポーネントを提供。
(6) 使用ケース
Embla Carousel:
軽量でカスタマイズ性の高いカルーセルが必要な場合。
例:独自のアニメーションやUIを構築したいプロジェクト、モバイルでの高精度スワイプを重視するケース。
パフォーマンス重視のプロジェクトや、バンドルサイズを最小限に抑えたい場合。
Swiper:
すぐに使えるリッチなカルーセルが必要な場合。
例:ナビゲーション、ページネーション、エフェクトを素早く実装したいプロジェクト。
複雑な設定なしで標準的なカルーセルを導入したい場合。
(7) コミュニティとエコシステム
Embla Carousel:
オープンソース(MITライセンス)、GitHubスター約7,000。コミュニティは小規模だが、コントリビューションが活発。
プラグインは限定的(例:Autoplay、Wheel Gestures)。
Swiper:
オープンソース(MITライセンス)、GitHubスター約40,000。コミュニティが大きく、商用プロジェクトでの採用例が多い。
豊富なドキュメントとサードパーティの拡張。
(8) アクセシビリティ
Embla Carousel:
デフォルトではアクセシビリティ機能(例:ARIA属性)が不足。自分で実装する必要がある。
Swiper:
アクセシビリティ対応が充実(例:キーボードナビゲーション、ARIA属性)。すぐに使える状態でアクセシブル。
3. 実装例の比較
Embla Carousel
code:javascript
import EmblaCarousel from 'embla-carousel';
const emblaNode = document.querySelector('.embla');
const embla =roomba = EmblaCarousel(emblaNode, { loop: true });
embla.on('select', () => {
console.log('スライド変更');
});
Swiper
code:javascript
import Swiper from 'swiper';
import 'swiper/swiper-bundle.css';
const swiper = new Swiper('.swiper', {
loop: true,
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
pagination: {
el: '.swiper-pagination',
},
});
4. どちらを選ぶべきか?
Embla Carouselを選ぶ場合:
軽量で高速なカルーセルが必要。
スワイプ精度や流動的なアニメーションを重視。
高度なカスタマイズや独自のUI/動作を実装したい。
バンドルサイズを最小限に抑えたい。
Swiperを選ぶ場合:
すぐに使えるリッチな機能(ナビゲーション、ページネーション、エフェクトなど)が必要。
アクセシビリティやクロスブラウザ対応を重視。
短期間で標準的なカルーセルを導入したい。
大規模なコミュニティや豊富なドキュメントを求める。
結論
Embla Carouselは軽量でカスタマイズ性が高く、スワイプ精度に優れたカルーセルを求める開発者に最適。一方、Swiperは多機能で設定が簡単、すぐに使えるカルーセルが必要な場合に適している。
参考文献:
Embla Carousel公式ドキュメント
Swiper公式ドキュメント
RedditおよびStack Overflowのユーザー投稿
#js
#carousel